global start

section .text
bits 32
start:
    ; print `OK` to screen
    mov dword [0xb8000], 0x2f4b2f4f
    ;hlt

    mov     edi, eax        ; arg1: magic: 0x2BADB002
    mov     esi, ebx        ; arg2: multiboot info

    mov cx, 65535
delay_loop0:
    dec cx
    cmp cx, 0
    jne delay_loop0

    ; 关闭蜂鸣器
    mov al, 0x90            ; 设定8254计数器2为二进制、方式3、读写低字节/高字节、计数器2。
    out 0x43, al            ; 发送命令字节到控制字寄存器。

    in al, 0x61             ; 从端口0x61（8255 PPI的Port B）读取当前值
    and al, 0xFC            ; 操作位2和位1来关闭扬声器。
    out 0x61, al            ; 写回新的值以实际应用更改。
; ---------------------------------------------------------------------------

    ; 设置字符属性（颜色）
    mov ah, 0x0e        ; 存储子功能号到寄存器 ah (0x0e 是用于 teletype 输出的功能)
    xor bh, bh          ; 将寄存器 bh 清零 (0 是默认的显示页)

    mov al, 'A'         ; 存储要显示的字符到寄存器 al
    int 0x10            ; 使用 BIOS 中断 0x10 来执行显示操作

    mov al, 'r'         ; 存储要显示的字符到寄存器 al
    int 0x10            ; 使用 BIOS 中断 0x10 来执行显示操作

    mov al, 'c'         ; 存储要显示的字符到寄存器 al
    int 0x10            ; 使用 BIOS 中断 0x10 来执行显示操作

    mov al, 'e'         ; 存储要显示的字符到寄存器 al
    int 0x10            ; 使用 BIOS 中断 0x10 来执行显示操作

    mov al, 'O'         ; 存储要显示的字符到寄存器 al
    int 0x10            ; 使用 BIOS 中断 0x10 来执行显示操作

    mov al, 'S'         ; 存储要显示的字符到寄存器 al
    int 0x10            ; 使用 BIOS 中断 0x10 来执行显示操作

    mov al, ';'         ; 存储要显示的字符到寄存器 al
    int 0x10            ; 使用 BIOS 中断 0x10 来执行显示操作

    mov esp, 0x0000c000
    mov al, '!'
    call print_char

bsp_entry32:
    jmp     bsp_entry32

print_char:
    xor bh, bh
    mov ah, 0x0e
    mov al, '@'
    int 0x10
    ret

    hlt
